"""
公共参数模型定义
用于存储用户的公共参数配置，支持在脚本中调用
"""
from datetime import datetime
from . import db
from ..timezone_utils import now as timezone_now


class GlobalParameter(db.Model):
    """公共参数模型"""
    __tablename__ = 'global_parameters'
    
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False, index=True)  # 参数名称
    value = db.Column(db.Text, nullable=False)  # 参数值
    description = db.Column(db.Text)  # 参数描述
    is_encrypted = db.Column(db.Boolean, default=False, nullable=False)  # 是否加密存储
    is_enabled = db.Column(db.Boolean, default=True, nullable=False)  # 是否启用
    
    # 外键 - 用户隔离
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False, index=True)
    
    # 时间戳
    created_at = db.Column(db.DateTime, default=timezone_now, nullable=False)
    updated_at = db.Column(db.DateTime, default=timezone_now, onupdate=timezone_now)
    
    # 关联用户
    user = db.relationship('User', backref='global_parameters')
    
    # 唯一约束：同一用户下参数名不能重复
    __table_args__ = (
        db.UniqueConstraint('user_id', 'name', name='uq_user_parameter_name'),
    )
    
    def to_dict(self):
        """转换为字典格式"""
        return {
            'id': self.id,
            'name': self.name,
            'value': self.value if not self.is_encrypted else '***',  # 加密参数不显示真实值
            'description': self.description,
            'is_encrypted': self.is_encrypted,
            'is_enabled': self.is_enabled,
            'user_id': self.user_id,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
    
    def to_dict_with_value(self):
        """转换为字典格式（包含真实值，用于脚本执行）"""
        return {
            'id': self.id,
            'name': self.name,
            'value': self.value,  # 返回真实值
            'description': self.description,
            'is_encrypted': self.is_encrypted,
            'is_enabled': self.is_enabled,
            'user_id': self.user_id,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
    
    @staticmethod
    def get_user_parameters(user_id, enabled_only=True):
        """获取用户的所有公共参数"""
        query = GlobalParameter.query.filter_by(user_id=user_id)
        if enabled_only:
            query = query.filter_by(is_enabled=True)
        return query.all()
    
    @staticmethod
    def get_user_parameters_dict(user_id, enabled_only=True):
        """获取用户的公共参数字典（参数名 -> 参数值）"""
        parameters = GlobalParameter.get_user_parameters(user_id, enabled_only)
        return {param.name: param.value for param in parameters}
    
    def __repr__(self):
        return f'<GlobalParameter {self.name}={self.value[:20]}...>'